﻿using System.Collections.Generic;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using SocialApi.Core.Request;
using SocialApi.Instagram.AppSettings;

namespace SocialApi.Instagram.Entities.Methods.Comments
{
    internal class CommentMethods : ICommentMethods
    {
        #region Члены ICommentMethods

        #region GET

        /// <summary>
        /// Получает список всех комментариев текущего медиа
        /// </summary>
        /// <param name="mediaId">Id медиа</param>
        public IEnumerable<ICommentData> Comments(long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Comment, mediaId));
            var jObject = JObject.Parse(Navigator.Instance.Get(url));
            InstagramService.CheckResult(jObject);
#if NET_4_5 || NET_4_0
            return jObject["data"].ToObject<IEnumerable<CommentData>>();
#else
            return jObject["data"].ToObject<List<CommentData>>() as IEnumerable<ICommentData>;
#endif
        }

        /// <summary>
        /// Асинхронно получает список всех комментариев текущего медиа
        /// </summary>
        /// <param name="mediaId">Id медиа</param>
        public async Task<IEnumerable<ICommentData>> CommentsAsync(long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Comment, mediaId));
            var result = await Navigator.Instance.GetAsync(url);
            var jObject = JObject.Parse(result);
            InstagramService.CheckResult(jObject);
#if NET_4_5 || NET_4_0
            return jObject["data"].ToObject<IEnumerable<CommentData>>();
#else
            return jObject["data"].ToObject<IEnumerable<CommentData>>() as IEnumerable<ICommentData>;
#endif
        }

        #endregion

        #region POST

        /// <summary>
        /// Добавляет новый комментарий для текущего медиа
        /// </summary>
        /// <param name="comment">Текст комментария</param>
        /// <param name="mediaId">Id медиа</param>
        public void Comments(string comment, long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Comment, mediaId));
            Navigator.Instance.Post(url, new { text = comment });
        }

        /// <summary>
        /// Добавляет новый комментарий для текущего медиа
        /// </summary>
        /// <param name="comment">Текст комментария</param>
        /// <param name="mediaId">Id медиа</param>
        public async Task CommentsAsync(string comment, long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Comment, mediaId));
            await Navigator.Instance.PostAsync(url, new { text = comment });
        }

        #endregion

        #region DELETE

        /// <summary>
        /// Удаляет комментарий для текущего медиа
        /// </summary>
        /// <param name="commentId">Id комментария</param>
        /// <param name="mediaId">Id медиа</param>
        public void Comments(long commentId, long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Comment, mediaId));
            Navigator.Instance.Delete(url);
        }

        /// <summary>
        /// Удаляет комментарий для текущего медиа
        /// </summary>
        /// <param name="commentId">Id комментария</param>
        /// <param name="mediaId">Id медиа</param>
        public async Task CommentsAsync(long commentId, long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Comment, mediaId));
            await Navigator.Instance.DeleteAsync(url);
        }

        #endregion

        #endregion
    }
}